Role-Based Authorization কি এবং এর প্রয়োগ

Java Technologies - স্প্রিং সিকিউরিটি (Spring Security) - Role-Based এবং Permission-Based Authorization
171

Role-Based Authorization হলো Spring Security-এর একটি পদ্ধতি যেখানে ব্যবহারকারীর অনুমতি (Authorization) নির্ধারণ করা হয় তাদের Role এর উপর ভিত্তি করে। একটি Role মূলত অ্যাপ্লিকেশনের ভেতরে নির্ধারিত কিছু অনুমতির একটি সেট, যা ব্যবহারকারীর নির্দিষ্ট রিসোর্স বা কার্যক্রমে অ্যাক্সেসের অধিকার দেয়।

উদাহরণস্বরূপ:

  • USER রোলের অধিকারী ব্যবহারকারীরা সাধারণ ফিচার অ্যাক্সেস করতে পারে।
  • ADMIN রোলের অধিকারী ব্যবহারকারীরা অ্যাডমিন প্যানেল এবং উন্নত ফিচারগুলোতে অ্যাক্সেস করতে পারে।

Role-Based Authorization-এর সুবিধা

  1. সহজ ব্যবস্থাপনা:
    • ব্যবহারকারীর অনুমতি সরাসরি রোলের মাধ্যমে পরিচালনা করা সহজ।
  2. স্কেলযোগ্যতা:
    • বড় অ্যাপ্লিকেশনগুলোর জন্য রোল-ভিত্তিক সিস্টেম স্কেল করা সহজ।
  3. পুনঃব্যবহারযোগ্যতা:
    • একাধিক রিসোর্সের জন্য একই রোল ব্যবহার করা যায়।
  4. নিরাপত্তা বৃদ্ধি:
    • স্পষ্টভাবে সংজ্ঞায়িত রোল এবং অনুমতির মাধ্যমে অ্যাপ্লিকেশনকে সুরক্ষিত রাখা যায়।

Spring Security-তে Role-Based Authorization এর প্রয়োগ

1. ডিপেন্ডেন্সি যোগ করা

Maven:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
Gradle:
implementation 'org.springframework.boot:spring-boot-starter-security'

2. ইন-মেমরি রোল ভিত্তিক ইউজার ডিফাইন করা

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .withUser("user").password(passwordEncoder().encode("password")).roles("USER")
            .and()
            .withUser("admin").password(passwordEncoder().encode("admin")).roles("ADMIN");
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();  // Password encoding
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/user/**").hasRole("USER")  // USER রোলের জন্য
                .antMatchers("/admin/**").hasRole("ADMIN")  // ADMIN রোলের জন্য
                .anyRequest().authenticated()  // অন্য সবকিছুর জন্য অথেন্টিকেশন প্রয়োজন
            .and()
            .formLogin()  // ফর্ম ভিত্তিক লগইন সক্রিয়
            .and()
            .logout();    // লগআউট সক্রিয়
    }
}

3. রোল ভিত্তিক অনুমোদনের জন্য অ্যানোটেশন ব্যবহার

Spring Security-তে রোল ভিত্তিক অথরাইজেশনের জন্য @PreAuthorize বা @Secured অ্যানোটেশন ব্যবহার করা যায়।

@PreAuthorize ব্যবহার:
@RestController
@RequestMapping("/api")
public class RoleBasedController {

    @GetMapping("/user")
    @PreAuthorize("hasRole('USER')")
    public String userAccess() {
        return "Welcome, USER!";
    }

    @GetMapping("/admin")
    @PreAuthorize("hasRole('ADMIN')")
    public String adminAccess() {
        return "Welcome, ADMIN!";
    }
}
@Secured ব্যবহার:
@RestController
@RequestMapping("/api")
public class RoleBasedController {

    @GetMapping("/user")
    @Secured("ROLE_USER")
    public String userAccess() {
        return "Welcome, USER!";
    }

    @GetMapping("/admin")
    @Secured("ROLE_ADMIN")
    public String adminAccess() {
        return "Welcome, ADMIN!";
    }
}

মনে রাখুন:

  • @Secured ব্যবহারের ক্ষেত্রে ROLE_ প্রিফিক্স প্রয়োজন।
  • @PreAuthorize ব্যবহার করলে ROLE_ প্রিফিক্স দরকার হয় না।

4. ডাটাবেস ভিত্তিক রোল ব্যবস্থাপনা

ডাটাবেস থেকে ইউজার এবং রোল লোড করার জন্য UserDetailsService ব্যবহার করা হয়।

ডাটাবেস টেবিল কাঠামো:
CREATE TABLE users (
    username VARCHAR(50) PRIMARY KEY,
    password VARCHAR(100) NOT NULL,
    enabled BOOLEAN NOT NULL
);

CREATE TABLE roles (
    id INT PRIMARY KEY AUTO_INCREMENT,
    role_name VARCHAR(50) NOT NULL
);

CREATE TABLE user_roles (
    username VARCHAR(50),
    role_id INT,
    FOREIGN KEY (username) REFERENCES users(username),
    FOREIGN KEY (role_id) REFERENCES roles(id)
);
কনফিগারেশন:
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.jdbcAuthentication()
        .dataSource(dataSource)
        .usersByUsernameQuery("SELECT username, password, enabled FROM users WHERE username = ?")
        .authoritiesByUsernameQuery("SELECT u.username, r.role_name FROM user_roles ur " +
                "JOIN users u ON ur.username = u.username " +
                "JOIN roles r ON ur.role_id = r.id WHERE u.username = ?");
}

উদাহরণ API

রোল ভিত্তিক URL অ্যাক্সেস:

@RestController
@RequestMapping("/api")
public class RoleBasedController {

    @GetMapping("/user")
    public String userAccess() {
        return "User content";
    }

    @GetMapping("/admin")
    public String adminAccess() {
        return "Admin content";
    }

    @GetMapping("/all")
    public String allAccess() {
        return "Public content";
    }
}

কনফিগারেশন:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .antMatchers("/api/all").permitAll()  // Public access
            .antMatchers("/api/user").hasRole("USER")  // USER role required
            .antMatchers("/api/admin").hasRole("ADMIN")  // ADMIN role required
            .anyRequest().authenticated()
        .and()
        .formLogin()
        .and()
        .logout();
}

উপসংহার

Role-Based Authorization একটি জনপ্রিয় এবং কার্যকর পদ্ধতি যা ব্যবহারকারীর অ্যাক্সেস কন্ট্রোল ম্যানেজ করতে সাহায্য করে। Spring Security-তে এটি সহজে বাস্তবায়ন করা যায় এবং ইন-মেমরি বা ডাটাবেস উভয় ক্ষেত্রেই সমর্থন প্রদান করে। এটি বড় অ্যাপ্লিকেশনগুলিতে নিরাপত্তা নিশ্চিত করার জন্য অত্যন্ত গুরুত্বপূর্ণ।

Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...